From f89d38bc2d139ae1baab5c25e1d6ac451a2d5a5e Mon Sep 17 00:00:00 2001 From: =?utf8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1?= =?utf8?q?=D1=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= Date: Sat, 29 Mar 2014 21:28:33 +0000 Subject: [PATCH] W32: RGBA GDK backend (broken) https://bugzilla.gnome.org/show_bug.cgi?id=727316 --- configure.ac | 19 ++++++++++++++++ gdk/win32/gdkscreen-win32.c | 2 +- gdk/win32/gdkvisual-win32.c | 1 - gdk/win32/gdkwindow-win32.c | 44 ++++++++++++++++++++++++++++++++++++- 4 files changed, 63 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 462bcca901..0556016b67 100644 --- a/configure.ac +++ b/configure.ac @@ -363,6 +363,25 @@ fi AC_SUBST(ENABLE_ON_X11) if test "$enable_win32_backend" = "yes"; then + AC_MSG_CHECKING([for DWM]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ + #include + #include + ]], + [[ + DWM_BLURBEHIND bb; + memset (&bb, 0, sizeof (bb)); + bb.dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION; + ]] + )], + [dwm_ok=yes], [dwm_ok=no] + ) + AC_MSG_RESULT($dwm_ok) + if test "$dwm_ok" = "yes"; then + AC_DEFINE([HAVE_W32_DWM], [1], [Define if W32 DWM API is available]) + fi + cairo_backends="$cairo_backends cairo-win32" GDK_BACKENDS="$GDK_BACKENDS win32" backend_immodules="$backend_immodules,ime" diff --git a/gdk/win32/gdkscreen-win32.c b/gdk/win32/gdkscreen-win32.c index 8cab47117d..d2c2dea1b7 100644 --- a/gdk/win32/gdkscreen-win32.c +++ b/gdk/win32/gdkscreen-win32.c @@ -211,7 +211,7 @@ gdk_win32_screen_class_init (GdkWin32ScreenClass *klass) screen_class->get_monitor_geometry = gdk_win32_screen_get_monitor_geometry; screen_class->get_monitor_workarea = gdk_win32_screen_get_monitor_geometry; screen_class->get_system_visual = _gdk_win32_screen_get_system_visual; - screen_class->get_rgba_visual = gdk_win32_screen_get_rgba_visual; + screen_class->get_rgba_visual = _gdk_win32_screen_get_system_visual; screen_class->is_composited = gdk_win32_screen_is_composited; screen_class->make_display_name = gdk_win32_screen_make_display_name; screen_class->get_active_window = gdk_win32_screen_get_active_window; diff --git a/gdk/win32/gdkvisual-win32.c b/gdk/win32/gdkvisual-win32.c index 34ee4340ed..6f84db33b7 100644 --- a/gdk/win32/gdkvisual-win32.c +++ b/gdk/win32/gdkvisual-win32.c @@ -194,7 +194,6 @@ _gdk_visual_init (GdkScreen *screen) } else if (bitspixel == 24 || bitspixel == 32) { - bitspixel = 24; system_visual->type = GDK_VISUAL_TRUE_COLOR; system_visual->red_mask = 0x00FF0000; system_visual->green_mask = 0x0000FF00; diff --git a/gdk/win32/gdkwindow-win32.c b/gdk/win32/gdkwindow-win32.c index aa8f5916ea..307a1fb840 100644 --- a/gdk/win32/gdkwindow-win32.c +++ b/gdk/win32/gdkwindow-win32.c @@ -38,6 +38,9 @@ #include "gdkdisplayprivate.h" #include "gdkvisualprivate.h" #include "gdkwin32window.h" +#ifdef HAVE_W32_DWM +#include +#endif #include @@ -684,6 +687,45 @@ _gdk_win32_display_create_window_impl (GdkDisplay *display, if (attributes_mask & GDK_WA_CURSOR) gdk_window_set_cursor (window, attributes->cursor); + +/* HAVE_W32_DWM means that we have necessary declarations at compile-time, + * but we'd still like to be able to run on XP, so we'll load the only non-XP + * function we need here at runtime. + */ +#ifdef HAVE_W32_DWM + { + typedef HRESULT (WINAPI *PFN_DwmEnableBlurBehindWindow)(HWND, + const DWM_BLURBEHIND *); + HMODULE dwmdll; + PFN_DwmEnableBlurBehindWindow dwmEnableBlurBehindWindow = NULL; + + dwmdll = GetModuleHandle ("dwmapi.dll"); + dwmEnableBlurBehindWindow = (PFN_DwmEnableBlurBehindWindow) + GetProcAddress (dwmdll, "DwmEnableBlurBehindWindow"); + + if (dwmEnableBlurBehindWindow) + { + /* Enable blurbehind, but give it an empty region, leaving us + with all the transparency with none of the blur */ + DWM_BLURBEHIND bb; + HRGN hRgn; + hRgn = CreateRectRgn (0, 0, -1, -1); + if (hRgn != NULL) + { + HRESULT hr; + memset (&bb, 0, sizeof (bb)); + bb.dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION; + bb.hRgnBlur = hRgn; + bb.fEnable = TRUE; + hr = dwmEnableBlurBehindWindow (GDK_WINDOW_HWND (window), &bb); + if (S_OK != hr) + g_warning ("%s: %s failed: %" G_GINT64_MODIFIER "x", G_STRLOC, + "DwmEnableBlurBehindWindow", (guint64) hr); + DeleteObject (hRgn); + } + } + } +#endif } GdkWindow * @@ -3387,7 +3429,7 @@ gdk_win32_ref_cairo_surface (GdkWindow *window) if (!hdc) return NULL; - impl->cairo_surface = cairo_win32_surface_create (hdc); + impl->cairo_surface = cairo_win32_surface_create_with_alpha (hdc); cairo_surface_set_user_data (impl->cairo_surface, &gdk_win32_cairo_key, impl, gdk_win32_cairo_surface_destroy); -- 2.30.2